/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI;


import TeoriaDeColas.Cliente;
import TeoriaDeColas.Engine;
import TeoriaDeColas.Variables_Globales;
import java.io.*;
import java.util.Iterator;
import java.util.concurrent.Semaphore;

/**
 *
 * @author Karadak
 */

public class XtendSimulador extends javax.swing.JFrame implements Runnable {

    static Engine simulador;        // simulador 
    double tiempo;                  // tiempo de simulacion
    
    static int contadorSalida = 0;  // contamos cuantos clientes son atendidos
    boolean pausa = false;          // bandera cuando el sistema esta en pausa
    boolean detener = false;        // bandera para detener el si
    boolean nuevo = false;          // ventana nueva
    int reloj = 0;                  // control de tiempo
    double total_tiempo_Sistema=0;  // total de tiempo en el sistema para clientes
    double total_tiempo_cola=0;     // tiempo total en cola
            
    
    private boolean empezar;        // ha iniciado: bandera
    
    public XtendSimulador(Engine simulador, double tiempo_exe) 
    {
        initComponents();               
        setLocationRelativeTo(null) ;
        this.setExtendedState(MAXIMIZED_BOTH);
        
        XtendSimulador.simulador = simulador;
        this.tiempo = tiempo_exe;
        
        Variables_Globales.velocidad_simulador = 1000;
      
        Variables_Globales.mutex_cola = new Semaphore(1,true);
        
       // cuadros de animacion respectivos
        simulador.setLinea_entrada(linea_entrada);
        simulador.setStackServidores(this.ServertStack);
        simulador.setLinea_servicio(this.linea_servicio);
        simulador.setLina_salida(this.linea_salida);

        Variables_Globales.pausar_simulador = false;
               
        
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        info_proyecto = new javax.swing.JDialog();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jLabel2 = new javax.swing.JLabel();
        close_tab = new javax.swing.JDialog();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextArea2 = new javax.swing.JTextArea();
        jLabel3 = new javax.swing.JLabel();
        close_proyecto = new javax.swing.JDialog();
        jScrollPane3 = new javax.swing.JScrollPane();
        jTextArea3 = new javax.swing.JTextArea();
        jLabel4 = new javax.swing.JLabel();
        herramientas = new javax.swing.JToolBar();
        nuevo_archivo = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        b_ejecutar = new javax.swing.JButton();
        b_pausa = new javax.swing.JButton();
        b_detener = new javax.swing.JButton();
        jSeparator6 = new javax.swing.JToolBar.Separator();
        b_stats = new javax.swing.JButton();
        jSeparator3 = new javax.swing.JToolBar.Separator();
        timer = new javax.swing.JLabel();
        Fondo = new javax.swing.JPanel();
        LEntrada = new javax.swing.JLabel();
        LCola = new javax.swing.JLabel();
        LSalida = new javax.swing.JLabel();
        ServertStack = new javax.swing.JPanel();
        linea_entrada = new javax.swing.JPanel();
        linea_servicio = new javax.swing.JPanel();
        linea_salida = new javax.swing.JPanel();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem6 = new javax.swing.JMenuItem();
        jMenuItem5 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem8 = new javax.swing.JMenuItem();
        jMenu4 = new javax.swing.JMenu();
        jMenuItem10 = new javax.swing.JMenuItem();
        jMenuItem11 = new javax.swing.JMenuItem();

        info_proyecto.setTitle("Proyecto");
        info_proyecto.setBounds(new java.awt.Rectangle(10, 325, 250, 150));

        jTextArea1.setColumns(20);
        jTextArea1.setEditable(false);
        jTextArea1.setFont(new java.awt.Font("Dialog", 1, 11)); // NOI18N
        jTextArea1.setRows(5);
        jTextArea1.setText("Puede crear un nuevo proyecto,\n  - agregar archivos de sonido CNGA\n  - visualizar pentagrama\n  - escuchar archivo de sonido");
        jTextArea1.setDisabledTextColor(new java.awt.Color(51, 51, 255));
        jScrollPane1.setViewportView(jTextArea1);

        jLabel2.setFont(new java.awt.Font("DialogInput", 1, 12)); // NOI18N
        jLabel2.setForeground(new java.awt.Color(204, 0, 0));
        jLabel2.setText("Nuevo Proyecto");

        javax.swing.GroupLayout info_proyectoLayout = new javax.swing.GroupLayout(info_proyecto.getContentPane());
        info_proyecto.getContentPane().setLayout(info_proyectoLayout);
        info_proyectoLayout.setHorizontalGroup(
            info_proyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
            .addGroup(info_proyectoLayout.createSequentialGroup()
                .addGroup(info_proyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(info_proyectoLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(info_proyectoLayout.createSequentialGroup()
                        .addGap(75, 75, 75)
                        .addComponent(jLabel2)))
                .addContainerGap(164, Short.MAX_VALUE))
        );
        info_proyectoLayout.setVerticalGroup(
            info_proyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
            .addGroup(info_proyectoLayout.createSequentialGroup()
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(196, Short.MAX_VALUE))
        );

        close_tab.setTitle("Cerrar Pestaña Actual");
        close_tab.setBounds(new java.awt.Rectangle(600, 325, 250, 150));

        jTextArea2.setColumns(20);
        jTextArea2.setEditable(false);
        jTextArea2.setFont(new java.awt.Font("Dialog", 1, 11)); // NOI18N
        jTextArea2.setRows(5);
        jTextArea2.setText("Cierra la pestaña Actual?\n\n  - no Guarda el contenido...!\n");
        jTextArea2.setDisabledTextColor(new java.awt.Color(51, 51, 255));
        jScrollPane2.setViewportView(jTextArea2);

        jLabel3.setFont(new java.awt.Font("DialogInput", 1, 12)); // NOI18N
        jLabel3.setForeground(new java.awt.Color(204, 0, 0));
        jLabel3.setText("Cerrar Pestaña");

        javax.swing.GroupLayout close_tabLayout = new javax.swing.GroupLayout(close_tab.getContentPane());
        close_tab.getContentPane().setLayout(close_tabLayout);
        close_tabLayout.setHorizontalGroup(
            close_tabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
            .addGroup(close_tabLayout.createSequentialGroup()
                .addGroup(close_tabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(close_tabLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(close_tabLayout.createSequentialGroup()
                        .addGap(75, 75, 75)
                        .addComponent(jLabel3)))
                .addContainerGap(164, Short.MAX_VALUE))
        );
        close_tabLayout.setVerticalGroup(
            close_tabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
            .addGroup(close_tabLayout.createSequentialGroup()
                .addComponent(jLabel3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(196, Short.MAX_VALUE))
        );

        close_proyecto.setTitle("Cerrar Peoyecto Actual");
        close_proyecto.setBounds(new java.awt.Rectangle(600, 325, 250, 150));

        jTextArea3.setColumns(20);
        jTextArea3.setEditable(false);
        jTextArea3.setFont(new java.awt.Font("Dialog", 1, 11)); // NOI18N
        jTextArea3.setRows(5);
        jTextArea3.setText("Cierra el Proyecto Actual?\n\n- no Guarda los cambios en los archivos...!\n");
        jTextArea3.setDisabledTextColor(new java.awt.Color(51, 51, 255));
        jScrollPane3.setViewportView(jTextArea3);

        jLabel4.setFont(new java.awt.Font("DialogInput", 1, 12)); // NOI18N
        jLabel4.setForeground(new java.awt.Color(204, 0, 0));
        jLabel4.setText("Cerrar Proyecto");

        javax.swing.GroupLayout close_proyectoLayout = new javax.swing.GroupLayout(close_proyecto.getContentPane());
        close_proyecto.getContentPane().setLayout(close_proyectoLayout);
        close_proyectoLayout.setHorizontalGroup(
            close_proyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(close_proyectoLayout.createSequentialGroup()
                .addGroup(close_proyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(close_proyectoLayout.createSequentialGroup()
                        .addGap(75, 75, 75)
                        .addComponent(jLabel4))
                    .addGroup(close_proyectoLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(145, Short.MAX_VALUE))
        );
        close_proyectoLayout.setVerticalGroup(
            close_proyectoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(close_proyectoLayout.createSequentialGroup()
                .addComponent(jLabel4)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(213, Short.MAX_VALUE))
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("sinXtendSim - Engine - Grupo 1");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
        });

        herramientas.setRollover(true);

        nuevo_archivo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Iconos/nuevo.png"))); // NOI18N
        nuevo_archivo.setToolTipText("Nuevo Archivo CNGA (Ctrl +N )");
        nuevo_archivo.setFocusable(false);
        nuevo_archivo.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        nuevo_archivo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        nuevo_archivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nuevo_archivoActionPerformed(evt);
            }
        });
        herramientas.add(nuevo_archivo);
        herramientas.add(jSeparator2);

        b_ejecutar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Iconos/correr.png"))); // NOI18N
        b_ejecutar.setToolTipText("Compilar El Archivo Actual (Ctrl + R)");
        b_ejecutar.setFocusable(false);
        b_ejecutar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        b_ejecutar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        b_ejecutar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                b_ejecutarActionPerformed(evt);
            }
        });
        herramientas.add(b_ejecutar);

        b_pausa.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Iconos/pause.png"))); // NOI18N
        b_pausa.setToolTipText("Guardar Archhivo Como... (Alt + S)");
        b_pausa.setEnabled(false);
        b_pausa.setFocusable(false);
        b_pausa.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        b_pausa.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        b_pausa.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                b_pausaActionPerformed(evt);
            }
        });
        herramientas.add(b_pausa);

        b_detener.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Iconos/stop.png"))); // NOI18N
        b_detener.setToolTipText("Guardar Archivo (Ctrl + S)");
        b_detener.setEnabled(false);
        b_detener.setFocusable(false);
        b_detener.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        b_detener.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        b_detener.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                b_detenerActionPerformed(evt);
            }
        });
        herramientas.add(b_detener);
        herramientas.add(jSeparator6);

        b_stats.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Iconos/datos.png"))); // NOI18N
        b_stats.setFocusable(false);
        b_stats.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        b_stats.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        b_stats.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                b_statsActionPerformed(evt);
            }
        });
        herramientas.add(b_stats);
        herramientas.add(jSeparator3);

        timer.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        timer.setForeground(new java.awt.Color(255, 0, 0));
        timer.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Iconos/Simulador/Clock.png"))); // NOI18N
        timer.setText("Tiempo (S)");
        herramientas.add(timer);

        LEntrada.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        LEntrada.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Iconos/Simulador/Entrada.png"))); // NOI18N
        LEntrada.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        LEntrada.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);

        LCola.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        LCola.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Iconos/Simulador/Cola.png"))); // NOI18N
        LCola.setText("Sala de Espera");
        LCola.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        LCola.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);

        LSalida.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        LSalida.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Iconos/Simulador/Salida.png"))); // NOI18N
        LSalida.setText("Exit");
        LSalida.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        LSalida.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);

        ServertStack.setBorder(new javax.swing.border.MatteBorder(null));

        linea_entrada.setBorder(new javax.swing.border.MatteBorder(null));

        javax.swing.GroupLayout linea_entradaLayout = new javax.swing.GroupLayout(linea_entrada);
        linea_entrada.setLayout(linea_entradaLayout);
        linea_entradaLayout.setHorizontalGroup(
            linea_entradaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 190, Short.MAX_VALUE)
        );
        linea_entradaLayout.setVerticalGroup(
            linea_entradaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        linea_servicio.setBorder(new javax.swing.border.MatteBorder(null));

        javax.swing.GroupLayout linea_servicioLayout = new javax.swing.GroupLayout(linea_servicio);
        linea_servicio.setLayout(linea_servicioLayout);
        linea_servicioLayout.setHorizontalGroup(
            linea_servicioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 176, Short.MAX_VALUE)
        );
        linea_servicioLayout.setVerticalGroup(
            linea_servicioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        linea_salida.setBorder(new javax.swing.border.MatteBorder(null));

        javax.swing.GroupLayout linea_salidaLayout = new javax.swing.GroupLayout(linea_salida);
        linea_salida.setLayout(linea_salidaLayout);
        linea_salidaLayout.setHorizontalGroup(
            linea_salidaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 219, Short.MAX_VALUE)
        );
        linea_salidaLayout.setVerticalGroup(
            linea_salidaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout FondoLayout = new javax.swing.GroupLayout(Fondo);
        Fondo.setLayout(FondoLayout);
        FondoLayout.setHorizontalGroup(
            FondoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(FondoLayout.createSequentialGroup()
                .addGap(67, 67, 67)
                .addComponent(LEntrada)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(linea_entrada, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(LCola)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(linea_servicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(30, 30, 30)
                .addComponent(ServertStack, javax.swing.GroupLayout.DEFAULT_SIZE, 165, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(linea_salida, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(LSalida)
                .addGap(143, 143, 143))
        );
        FondoLayout.setVerticalGroup(
            FondoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(FondoLayout.createSequentialGroup()
                .addGap(213, 213, 213)
                .addGroup(FondoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(ServertStack, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(FondoLayout.createSequentialGroup()
                        .addGroup(FondoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(linea_salida, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addGroup(FondoLayout.createSequentialGroup()
                                .addGroup(FondoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(linea_servicio, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(LCola, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(LEntrada, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(linea_entrada, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                .addGap(1, 1, 1))
                            .addComponent(LSalida, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(146, 146, 146)))
                .addContainerGap())
        );

        jMenu1.setMnemonic('A');
        jMenu1.setText("Archivo");

        jMenuItem6.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem6.setText("Nuevo Proyecto");
        jMenuItem6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem6ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem6);

        jMenuItem5.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem5.setText("Salir");
        jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem5ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem5);

        jMenuBar1.add(jMenu1);

        jMenu2.setMnemonic('E');
        jMenu2.setText("Ejecutar");
        jMenu2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenu2ActionPerformed(evt);
            }
        });

        jMenuItem8.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem8.setText("Ejecutar");
        jMenuItem8.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem8ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItem8);

        jMenuBar1.add(jMenu2);

        jMenu4.setText("Ayuda");

        jMenuItem10.setText("Manual de Usuario");
        jMenuItem10.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem10ActionPerformed(evt);
            }
        });
        jMenu4.add(jMenuItem10);

        jMenuItem11.setText("Acerca de");
        jMenuItem11.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem11ActionPerformed(evt);
            }
        });
        jMenu4.add(jMenuItem11);

        jMenuBar1.add(jMenu4);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(herramientas, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(Fondo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(herramientas, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(Fondo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents
     
    private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened
        
        // inicializando entorno de dedicion
        this.herramientas.setFocusable(true);                
    }//GEN-LAST:event_formWindowOpened
    
    private void nuevo_archivoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nuevo_archivoActionPerformed
       nuevo_proyecto();
    }//GEN-LAST:event_nuevo_archivoActionPerformed

    /**
     * crea una nueva ventana
     */
    public void nuevo_proyecto()
    {
        nuevo = true;
        Informacion_Estadistica proyecto = new Informacion_Estadistica();
        proyecto.setVisible(true);
        this.setVisible(false);
    }
    
    private void b_detenerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_b_detenerActionPerformed
        this.detener();
    }//GEN-LAST:event_b_detenerActionPerformed

    private void b_pausaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_b_pausaActionPerformed

        pausarSimulacion();

    }//GEN-LAST:event_b_pausaActionPerformed

    private void b_ejecutarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_b_ejecutarActionPerformed
      ejecutar();
    }//GEN-LAST:event_b_ejecutarActionPerformed

    private void b_statsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_b_statsActionPerformed
        verEstadisticas();
    }//GEN-LAST:event_b_statsActionPerformed

    private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed
        nuevo_proyecto();
    }//GEN-LAST:event_jMenuItem6ActionPerformed

    private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem5ActionPerformed

        System.exit(0);

    }//GEN-LAST:event_jMenuItem5ActionPerformed

    private void jMenuItem8ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem8ActionPerformed
       ejecutar();
    }//GEN-LAST:event_jMenuItem8ActionPerformed

    private void jMenu2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenu2ActionPerformed
        
    }//GEN-LAST:event_jMenu2ActionPerformed

    
    private void jMenuItem10ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem10ActionPerformed
        File archivoX = new File("file.pdf");

        if (archivoX.exists()) {
            java.awt.Desktop d = java.awt.Desktop.getDesktop();
            try {
                d.open(archivoX);
            } catch (IOException ex) {
                System.out.println("Error en abrir manual de usuario");
            }
        }
    }//GEN-LAST:event_jMenuItem10ActionPerformed

    private void jMenuItem11ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem11ActionPerformed
//     
    }//GEN-LAST:event_jMenuItem11ActionPerformed

    /**
     * este metodo inicia la simulacion
     */
    public void ejecutar()
    {
        try
        {
            if(this.detener)
            {
                this.detener = false;       // quitamos pausa
            }
            else if(empezar)    // ya se habi iniciado el servicio, 
            {
                Variables_Globales.pausar_simulador = false;
                
                this.b_ejecutar.setEnabled(false);
                this.b_pausa.setEnabled(true);
                this.b_detener.setEnabled(true);
            }
            else // una nueva instancia de iniciar del sistema
            {
                Thread hilo = new Thread(this);
                
                simulador.iniciarSistema();     // iniciamos los hilos correspondientes
                hilo.start();
                
                this.b_ejecutar.setEnabled(false);
                this.b_pausa.setEnabled(true);
                this.b_detener.setEnabled(true);                

                empezar=true;
            }
        }
        catch(Exception er)
        {
            System.out.println("error en ejecutar "+er);
        }
        
    }
    
    /**
     * pausa la simulacion
     */
    public void pausarSimulacion()
    {
         this.pausa = true;

        Variables_Globales.pausar_simulador = true;
        this.b_pausa.setEnabled(false);
        this.b_ejecutar.setEnabled(true);
    }
    
    /**
     * detiene la simulacion
     */
    private void detener() 
    {
        this.detener = true;
        Variables_Globales.velocidad_simulador = 1000000000;
        this.b_detener.setEnabled(false);
        this.b_ejecutar.setEnabled(true);
    }
    
    /**
     * implmenetacion del metodo run para controlar los hilos
     */
    @Override
    public void run() 
    {
        total_tiempo_Sistema = 0;
        total_tiempo_cola = 0;
        
        try
        {
            // reloj del simulador
            for (int i = 0; i < tiempo; i++) 
            {
                timer.setText(Integer.toString(i+1) + " seg.");
                Thread.sleep(Variables_Globales.velocidad_simulador);
                while(Variables_Globales.pausar_simulador)
                {
                    Thread.sleep(100);
                }
            }
            simulador.killThread();
            
            /**
             * obtnemos estadisticas del sistema
             */
            Iterator<Cliente> tiempos = Variables_Globales.clientela.iterator();            
            while(tiempos.hasNext())
            {
                Cliente aux = tiempos.next();
                
                double ts = aux.getTiempoSistema();
                double tss = aux.getTiempoServicio();
                
                total_tiempo_Sistema += ts;
                total_tiempo_cola += ts - tss;
                
            }
            
            System.out.println("tiempo sistema "+total_tiempo_Sistema);
            System.out.println("tiempo cola "+total_tiempo_cola);
                 
            /**
             * llamamos a la ventana de estaditicas
             */
            verEstadisticas();
        }
        catch(Exception er)
        {
            System.out.println("error en run del simulador xtend "+er);
        }
    }
   
    /**
     * actualiza el tamaño de la cola 
     */
     public static void LenghtCola()
     {
        try
        {
            Variables_Globales.mutex_cola.acquire();           
            LCola.setText("Sala de espera: "+Integer.toString(simulador.cola.size()));           
            Variables_Globales.mutex_cola.release();            
            
        }
        catch(Exception er)
        {
            System.out.println("error en incrementar cola "+er);
        }
        
    }
         /**
          * actualiza el status de cuantos se han atendido
          */
     public static void cuantosSalen()
     {
        contadorSalida++;        
        LSalida.setText("Exit: "+contadorSalida);
     }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel Fondo;
    private static javax.swing.JLabel LCola;
    private javax.swing.JLabel LEntrada;
    private static javax.swing.JLabel LSalida;
    private javax.swing.JPanel ServertStack;
    private javax.swing.JButton b_detener;
    private javax.swing.JButton b_ejecutar;
    private javax.swing.JButton b_pausa;
    private javax.swing.JButton b_stats;
    private javax.swing.JDialog close_proyecto;
    private javax.swing.JDialog close_tab;
    private javax.swing.JToolBar herramientas;
    private javax.swing.JDialog info_proyecto;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu4;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem10;
    private javax.swing.JMenuItem jMenuItem11;
    private javax.swing.JMenuItem jMenuItem5;
    private javax.swing.JMenuItem jMenuItem6;
    private javax.swing.JMenuItem jMenuItem8;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JToolBar.Separator jSeparator3;
    private javax.swing.JToolBar.Separator jSeparator6;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextArea jTextArea2;
    private javax.swing.JTextArea jTextArea3;
    private javax.swing.JPanel linea_entrada;
    private javax.swing.JPanel linea_salida;
    private javax.swing.JPanel linea_servicio;
    private javax.swing.JButton nuevo_archivo;
    private javax.swing.JLabel timer;
    // End of variables declaration//GEN-END:variables

    
    /**
     * se calculan las estadisticas del proyecto y se envian a la ventana correspondiente
     */
    public void verEstadisticas()
    {
        try
        {
            double total_clientes = Variables_Globales.clientela.size();
            double Ts_medio = this.total_tiempo_Sistema / total_clientes;
            double Tq_medio = this.total_tiempo_cola / total_clientes;
            int longitud_cola = this.simulador.getCola().size();
            int personas_sistema = this.simulador.getCola().size();
            
            
            Estadisticas stats = new Estadisticas(
                    total_clientes,
                    Ts_medio,
                    Tq_medio,
                    longitud_cola,
                    personas_sistema);            
               
        
            stats.setVisible(true);
        }
        catch (Exception er)
        {
            System.out.println("error en mostrar estadisticas "+er);
        }
    }
}

